package com.flyduck.vueshop.cart.h5.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.ListUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.flyduck.vueshop.cart.h5.service.H5CartItemService;
import com.flyduck.vueshop.cart.h5.vo.H5CartItemAddReqVO;
import com.flyduck.vueshop.cart.h5.vo.H5CartItemRespVO;
import com.flyduck.vueshop.cart.entity.AppCartItem;
import com.flyduck.vueshop.cart.mapper.AppCartItemMapper;
import com.flyduck.vueshop.common.core.exception.BusinessException;
import com.flyduck.vueshop.common.core.utils.BeanUtils;
import com.flyduck.vueshop.common.sotoken.utils.StpUserUtil;
import com.flyduck.vueshop.product.feign.RemoteProductFeignClient;
import com.flyduck.vueshop.product.feign.RemoteSkuStockFeignClient;
import com.flyduck.vueshop.product.vo.RemoteProductRespVO;
import com.flyduck.vueshop.product.vo.RemoteSkuStockRespVO;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * @program: vueshop
 * @description:
 * @author: flyduck
 * @create: 2024-05-19 09:30
 **/
@Service
public class H5CartItemServiceImpl implements H5CartItemService {

    @Resource
    private AppCartItemMapper appCartItemMapper;
    @Resource
    private RemoteSkuStockFeignClient remoteSkuStockFeignClient;
    @Resource
    private RemoteProductFeignClient remoteProductFeignClient;

    @Override
    public List<H5CartItemRespVO> getCartItemList() {
        Long userId = StpUserUtil.getLoginIdAsLong();
        List<AppCartItem> appCartItemList = appCartItemMapper.selectList(
                new LambdaQueryWrapper<AppCartItem>()
                        .eq(AppCartItem::getUserId, userId)
                        .orderByDesc(AppCartItem::getCreated)
        );
        List<H5CartItemRespVO> h5CartItemRespVOList = BeanUtils.toBeanList(appCartItemList, H5CartItemRespVO.class);
        for (H5CartItemRespVO h5CartItemRespVO : h5CartItemRespVOList) {
            RemoteProductRespVO remoteProductRespVO = remoteProductFeignClient.getProductById(h5CartItemRespVO.getProductId()).getData();
            h5CartItemRespVO.setProductName(remoteProductRespVO.getName());
            h5CartItemRespVO.setProductImage(remoteProductRespVO.getImage());
            RemoteSkuStockRespVO remoteSkuStockRespVO = remoteSkuStockFeignClient.getSkuStock(h5CartItemRespVO.getProductId(), h5CartItemRespVO.getSkuId()).getData();
            h5CartItemRespVO.setSku(remoteSkuStockRespVO.getSku());
            h5CartItemRespVO.setPrice(remoteSkuStockRespVO.getPrice());
        }
        return h5CartItemRespVOList;
    }

    @Override
    public Long getTotalCount() {
        Long userId = StpUserUtil.getLoginIdAsLong();
        Long totalCount = appCartItemMapper.selectCount(
                new LambdaQueryWrapper<AppCartItem>()
                        .eq(AppCartItem::getUserId, userId)
        );
        return totalCount;
    }

    @Override
    public BigDecimal getTotalAmountByIds(ArrayList<Long> ids) {
        Long userId = StpUserUtil.getLoginIdAsLong();
        if(CollectionUtil.isEmpty(ids)){
            return BigDecimal.ZERO;
        }
        //获取选中的购物车
        List<AppCartItem> appCartItemList = appCartItemMapper.selectList(
                new LambdaQueryWrapper<AppCartItem>()
                        .eq(AppCartItem::getUserId, userId)
                        .in(AppCartItem::getId,ids)
        );

        BigDecimal totalAmount = BigDecimal.ZERO;
        for (AppCartItem appCartItem : appCartItemList) {
            RemoteSkuStockRespVO remoteSkuStockRespVO = remoteSkuStockFeignClient.getSkuStock(appCartItem.getProductId(), appCartItem.getSkuId()).getData();
            totalAmount = totalAmount.add(remoteSkuStockRespVO.getPrice().multiply(new BigDecimal(appCartItem.getQuantity())));
        }
        return totalAmount;
    }

    @Override
    public void updateQuantityById(Long cartItemId, Integer quantity) {
        Long userId = StpUserUtil.getLoginIdAsLong();
        AppCartItem appCartItem = appCartItemMapper.selectById(cartItemId);

        //判断库存
        RemoteSkuStockRespVO remoteSkuStockRespVO = remoteSkuStockFeignClient.getSkuStock(appCartItem.getProductId(), appCartItem.getSkuId()).getData();
        if(quantity > remoteSkuStockRespVO.getStock()){
            throw new BusinessException("库存不足");
        }

        //更新数量
        appCartItemMapper.update(
                null,
                new LambdaUpdateWrapper<AppCartItem>()
                .eq(AppCartItem::getId,cartItemId)
                .eq(AppCartItem::getUserId,userId)
                .set(AppCartItem::getQuantity, quantity)
                .set(AppCartItem::getUpdated, LocalDateTime.now())
        );
    }

    @Override
    public void addCartItem(H5CartItemAddReqVO h5CartItemAddReqVO) {
        Long userId = StpUserUtil.getLoginIdAsLong();
        //判断商品是否为空、是否上架
        RemoteProductRespVO remoteProductRespVO = remoteProductFeignClient.getProductById(h5CartItemAddReqVO.getProductId()).getData();
        if (remoteProductRespVO == null || !remoteProductRespVO.getIsOnSale()) {
            throw new BusinessException("商品未上架");
        }

        // 判断库存是否足够
        RemoteSkuStockRespVO remoteSkuStockRespVO = remoteSkuStockFeignClient.getSkuStock(h5CartItemAddReqVO.getProductId(), h5CartItemAddReqVO.getSkuId()).getData();
        if(h5CartItemAddReqVO.getQuantity() > remoteSkuStockRespVO.getStock()){
            throw new BusinessException("库存不足");
        }

        AppCartItem existCartItem = appCartItemMapper.selectOne(
                new LambdaQueryWrapper<AppCartItem>()
                        .eq(AppCartItem::getUserId, userId)
                        .eq(AppCartItem::getProductId, h5CartItemAddReqVO.getProductId())
                        .eq(AppCartItem::getSkuId, h5CartItemAddReqVO.getSkuId())
        );

        if (existCartItem != null) {
            // 购物车已经存在该商品的情况：原来数量 + 新数量
            existCartItem.setQuantity(existCartItem.getQuantity() + h5CartItemAddReqVO.getQuantity());
            existCartItem.setUpdated(LocalDateTime.now());
            appCartItemMapper.updateById(existCartItem);
        }else {
            // 购物车未存在该商品的情况
            AppCartItem saveCartItem = new AppCartItem();
            saveCartItem.setUserId(userId);
            saveCartItem.setSkuId(h5CartItemAddReqVO.getSkuId());
            saveCartItem.setProductId(h5CartItemAddReqVO.getProductId());
            saveCartItem.setQuantity(h5CartItemAddReqVO.getQuantity());
            saveCartItem.setCreated(LocalDateTime.now());
            appCartItemMapper.insert(saveCartItem);
        }
    }

    @Override
    public void batchDeleteByIds(Long[] ids) {
        Long userId = StpUserUtil.getLoginIdAsLong();
        appCartItemMapper.delete(
                new LambdaQueryWrapper<AppCartItem>()
                .eq(AppCartItem::getUserId,userId)
                .in(AppCartItem::getId, ListUtil.toList(ids))
        );
    }
}
